package com.hnust.aopdemo.config;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * //匹配任何公共方法
 *
 * @Pointcut("execution(public * com.hnust.aopdemo.service.*.*(..))")
 * <p>
 * //匹配com.hnust.aopdemo包及子包下Service类中无参方法
 * @Pointcut("execution(* com.hnust.aopdemo..*Service.*())")
 * <p>
 * //匹配com.hnust.aopdemo包及子包下Service类中的任何只有一个参数的方法
 * @Pointcut("execution(* com.hnust.aopdemo..*Service.*(*))")
 * <p>
 * //匹配com.hnust.aopdemo包及子包下任何类的任何方法
 * @Pointcut("execution(* com.hnust.aopdemo..*.*(..))")
 * <p>
 * //匹配com.hnust.aopdemo包及子包下返回值为String的任何方法
 * @Pointcut("execution(String com.hnust.aopdemo..*.*(..))")
 * <p>
 * //匹配异常
 * execution(public * com.hnust.aopdemo.service.*.*(..) throws java.lang.IllegalAccessException)
 * <p>
 * Created by cat on 2017-02-19.
 */
@Aspect
@Component
public class ExecutionAspectConfig {

// @Pointcut("execution(public * com.hnust.aopdemo.service..*Service.*(..) throws java.lang.IllegalAccessException)")
// public void matchCondition(){}
//
// @Before("matchCondition()")
// public void before(){
//  System.out.println("");
//  System.out.println("###before");
// }

    /**
     * 注意：第一部分和第三部分可以省略
     * 第一部分： 方法修饰符   public
     * 第二部分： 返回值       *表示任意返回值
     * 第三部分： 包名        com.hnust.aopdemo.*Service.*(..)表示aopdemo包下的任意以Service结尾的类里面的任意方法，参数任意
     */
    @Pointcut("execution(public * com.hnust.aopdemo.*Service.*(..))")
    public void matchCondition() {

    }

    /**
     * 关键是注解，方法名不用before，可以任意
     */
    @Before("matchCondition()")
    public void before() {
        System.out.println("");
        System.out.println("###before");
    }

    @Pointcut("execution(public * com.hnust.aopdemo..*BO||*Service.save*(..))")
    public void testExce() {

    }

}
